from zipline.api import order, symbol, record
from zipline import run_algorithm
import pandas as pd

def initialize(context):
    # 设置策略参数
    context.fast_window = 10  # 短期均线周期
    context.slow_window = 30   # 长期均线周期
    context.asset = symbol('AAPL')  # 示例标的，实际使用时需替换
    
    # 初始化状态变量
    context.in_position = False

def handle_data(context, data):
    # 获取历史数据（至少需要慢速均线周期+1天）
    prices = data.history(context.asset, 'price', bar_count=context.slow_window+1, frequency='1d')
    
    # 检查数据是否足够
    if len(prices) < context.slow_window + 1:
        return
    
    # 计算均线
    fast_ma = prices[-context.fast_window:].mean()
    slow_ma = prices[-context.slow_window:].mean()
    
    # 获取前一天的均线值（用于交叉检测）
    prev_fast_ma = prices[-context.fast_window-1:-1].mean()
    prev_slow_ma = prices[-context.slow_window-1:-1].mean()
    
    # 记录指标值（可选）
    record(fast_ma=fast_ma, slow_ma=slow_ma)
    
    # 检测金叉（短期上穿长期）
    golden_cross = (prev_fast_ma < prev_slow_ma) and (fast_ma > slow_ma)
    
    # 检测死叉（短期下穿长期）
    death_cross = (prev_fast_ma > prev_slow_ma) and (fast_ma < slow_ma)
    
    # 交易逻辑
    if not context.in_position and golden_cross:
        # 计算可买数量（全仓买入）
        order(context.asset, context.portfolio.cash // data.current(context.asset, 'price'))
        context.in_position = True
    elif context.in_position and death_cross:
        # 清仓卖出
        order(context.asset, -context.portfolio.positions[context.asset].amount)
        context.in_position = False

# 示例回测调用（实际使用时需配置参数）
if __name__ == '__main__':
    start = pd.Timestamp('2020-01-01', tz='utc')
    end = pd.Timestamp('2023-01-01', tz='utc')
    
    results = run_algorithm(
        start=start,
        end=end,
        initialize=initialize,
        handle_data=handle_data,
        capital_base=10000,
        bundle='quandl'  # 需配置有效数据源
    )